package com.example.function.mybatis.typehandler;

import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.TypeHandler;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;

/**
 * 日期类型转换器
 * 将日期转换成时间戳，保存到数据库。
 * 从数据库取出时间戳转成Date对象
 */
public class DateTypeHandler implements TypeHandler<Date> {

    /**
     * 将Date对象转成时间戳，如果parameter参数为null，则保存当前时间戳
     * @param ps PreparedStatement对象
     * @param i 参数索引
     * @param parameter 需要保存的参数
     * @param jdbcType Jdbc类型
     * @throws SQLException 抛出异常
     */
    @Override
    public void setParameter(PreparedStatement ps, int i, Date parameter, JdbcType jdbcType) throws SQLException {
        if (parameter == null) {
            ps.setLong(i, System.currentTimeMillis());
        } else {
            ps.setLong(i, parameter.getTime());
        }
    }

    /**
     * 从数据库取出时间戳转成Date对象
     * @param rs ResultSet对象
     * @param columnName 数据库字段名
     * @return Date对象
     * @throws SQLException 抛出异常
     */
    @Override
    public Date getResult(ResultSet rs, String columnName) throws SQLException {
        return new Date(rs.getLong(columnName));
    }

    @Override
    public Date getResult(ResultSet rs, int columnIndex) throws SQLException {
        return new Date(rs.getLong(columnIndex));
    }

    @Override
    public Date getResult(CallableStatement cs, int columnIndex) throws SQLException {
        return new Date(cs.getLong(columnIndex));
    }
}
